<?php
namespace app\api\controller;

use app\api\controller\mytool\Mytool;
use app\api\controller\mytool\Wechat;
use app\common\model\power\Rolepowerlnk;
use app\common\model\user\User as UserModel;
use app\common\model\company\Company;
use Firebase\JWT\JWT;
use think\facade\Cache;

class Pub extends Base
{
    /**
     * 产生jwt加密串，参考session
     */
    public function initialize()
    {
        parent::initialize();
    }

    public function index()
    {
        //获取企业信息
        $rdata['description'] = '小微企业主要是指危险废物产生量相对较小的企业，还包括机动车维修点、科研机构和学校实验室等社会源。小微企业危险废物产生量少，但种类杂、点多面广，如不及时收集处理将存在较大环境风险隐患。小微企业长期以来受危险废物收集处理难困扰，亟需打通危险废物收集“最后一公里”。《通知》对加强小微企业危险废物污染防治，防范小微企业危险废物环境风险，保障人民群众身体健康具有重要意义；同时有助于推动各地完善小微企业危险废物收集体系建设，加快解决小微企业急难愁盼的危险废物收集处理难题。';
        $rdata['power']       = [];
        $rdata['companyname'] = COMPANYNAME;
        $sb                   = UserModel::is_sessionlogin();
        if ($sb['code']) {
            $rdata['power'] = Rolepowerlnk::getpowerlnk('index');
            //检测产废单位是否完善企业信息
            // $userinfo = User::getinfo();
            // $role = $userinfo->Role;
            // if($role==101){
            //     $company = Company::user_getinfo();
            //     if ($company == false) {
            //         return moerr('请先完善企业信息', '', 'gohawacreate');
            //     }
            // }
        }
        return myok($rdata);
    }

    /**
     * 获取jwtkey直接返回token
     * 账号登录
     * @param  [type] $uid [用户id]
     * @return [json]      [jwtkey]
     */
    public static function getjwtkeyarray($id = '')
    {
        if (empty($id)) {
            return serr('请登录账号');
        } else {
            $uid = $id;
        }
        $jwt = self::getjwtstr($uid);
        return sok($jwt);
    }

    /**
     * 获取jwtkey的字符串
     * @param  [type] $uid [用户id]
     * @return [str]      [jwtkey]
     */
    private static function getjwtstr($uid)
    {
        $key = JWT_KEY; //这里是自定义的一个随机字串，应该写在config文件中的，解密时也会用，相当    于加密中常用的 盐  salt
        try {
            $data    = UserModel::get($uid);
            $decoded = (array) JWT::decode($data->Jwt, $key, array('HS256')); //解密
            if ($decoded['exp'] > time() + 6000) {
                return $data->Jwt;
            }
        } catch (\Exception $e) {}
        $payload = array(
            "iss" => "", //签发者 可以为空
            "aud" => "", //面象的用户，可以为空
            "iat" => time(), //签发时间
            "nbf" => time(), //在什么时候jwt开始生效  （这里表示生成100秒后才生效）
            "exp" => time() + 43200, //token 过期时间
            "uid" => $uid, //记录的userid的信息，这里是自已添加上去的，如果有其它信息，可以再添加数组的键值对
        );
        $jwt  = JWT::encode($payload, $key, "HS256"); //加密
        $user = new UserModel();
        $user->save(['Jwt' => $jwt], ['UserId' => $uid]);
        return $jwt;
    }

    /**
     * 获取用户uid
     * @param  [type] $jwt [jwtkey]
     * @return [type]      [用户id]
     */
    public static function getuserid($jwt = '')
    {
        if (empty($jwt)) {
            $jwt = input('token');
        }
        $key = JWT_KEY; //这里是自定义的一个随机字串，应该写在config文件中的，解密时也会用，相当    于加密中常用的 盐  salt
        try {
            $decoded = (array) JWT::decode($jwt, $key, array('HS256')); //解密
            // dump($decoded);
            return ['code' => true, 'msg' => $decoded['uid']];
        } catch (\Exception $e) {
	        $user = UserModel::where('Jwt', $jwt)->find();
            if (empty($user)) {
                return serr('账号过期请登陆');
            } else {
                return ['code' => true, 'msg' => $user->UserId];
            }
        }
    }

    /**
     * 直接获取用户id
     * @return [type] [description]
     */
    public static function userid()
    {
        $data = self::getuserid();
        if ($data['code']) {
            return (int)$data['msg'];
        } else {
            return moerr($data['msg']);
        }
    }

    /**
     * 获取企业基础信息
     * @param  [type] $jwt [jwtkey]
     * @return [type]      [用户id]
     */
    public static function getcompanyinfo()
    {
        $id = input('id');
        if (empty($id)) {
            return myerr('缺少参数，请重新尝试');
        }
        $data = Company::user_getinfo($id);
        if (empty($data)) {
            return myerr('没有找到此单位');
        }
        $rdata['companyinfo'] = $data;
        if (!empty($data['UserId'])) {
            return myerr('单位已绑定无法查看');
        }
        $data = $data->visible(['Name','Img','Lon','Lat','Address','Tel','LicenseNumber','CompanyId','BussinessId'])->toArray();
        if(!empty($data['BussinessId'])){
            $buss = UserModel::get($data['BussinessId']);
            $data['buss'] = ['Tel'=>$buss['Iphone']];
        }else{
            $data['buss'] = ['Tel'=>CELLPHONE];
        }
        return myok($data);
    }

    /*-----验证码登录---*/

    /**
     * 发送验证码
     * @return [type] [description]
     */
    public function sendmessage()
    {
        $iphone = input('iphone');
        if (empty($iphone)) {
            return myerr('请输入您的手机号');
        }
        // $sb = UserModel::iphone_state($iphone);
        // if(!$sb['code']){
        //     return myerr($sb['msg']);
        // }
        $sb = Mytool::sendsms($iphone);
        return $sb;
    }

    /**
     * 验证码登陆
     * @return [type] [description]
     */
    public function messagelogin()
    {
        $iphone = input('phoneno');
        $code   = input('pwd');
        if (empty($iphone)) {
            return myerr('请输入手机号');
        }
        if (empty($code)) {
            return myerr('请输入验证码');
        }
        if (CAPTCHASTATUS) {
            $sb = Cache::get('s_iphone_' . $iphone, '');
            if (empty($sb)) {
                return myerr('验证码验证失败，请重新获取验证码');
            }
            if ($sb !== $code) {
                return myerr('验证码错误，请重新输入');
            }
        }
        $sb = UserModel::iphone_state($iphone);
        if (!$sb['code']) {
            return myerr($sb['msg']);
        }
        $data              = UserModel::getinfo($iphone);
        return myok(self::pub_login_after($data));
    }
    
    /**
     * 登陆通用组件
     * 涉及部分：手机登陆 、 微信登陆
     * 2024年1月2日23:06:39 增加时间
     * 后续一些配置信息会一次性传输给客户端，在由客户端决定是否请求对应的接口
     * @return [type] [description]
     */
    public static function pub_login_after($usermodel){
        $rdata['name']     = $usermodel->Name;
        $rdata['role']     = $usermodel->Role;
        $rdata['rolename'] = getrolename($usermodel->Role);
        $rdata['token']    = self::getjwtstr($usermodel->UserId);
        //开放的权限
        $rdata['pubfun_config']    = [
            'switch_Rebate'=>get_config_value('switch_Rebate'),//服务费功能
            'switch_revenue_account_period'=>get_config_value('switch_revenue_account_period'),//挂账功能
        ];
        return $rdata;
    }
    

    //----------------获取登陆二维码-------------------------
    // web+根据时间戳生成二维码 有效期3分钟
    // 进入页面后将key 绑定上 token + name + role
    // 轮训登陆状态 
    public function getloginqrcode(){
        $key = input('key');
        $type = '';
        if(empty($key)){
            //给新的key
            $type = 'getqr';
        }else{
            //判断是否已经登陆
            $sb = Cache::get($key);
            if(empty($sb)){
                $type = 'getqr';
            }else{
                if($sb['code']=='ok'){
                    //已经扫码
                    if(!empty($sb['msg'])){
                        $type = 'loginok';
                    }else{
                        $type = 'getqr';
                    }
                }else{
                    //没有扫码
                    $type = 'wait';
                }
            }
        }
        switch ($type) {
            case 'getqr'://获取新的码
                $token = md5(time().rand(10000,9999).time());
                $str = 'login_'.$token;
                Cache::set($str,['code'=>'no','msg'=>time()],360);
                $res = Wechat::qrcode($str);
                return myok(['login'=>'getqr','token'=>$str,'data'=>$res]);
                break;
            case 'loginok'://登陆成功跳转
                $data              = UserModel::getinfo('',$sb['msg']);
                $rdata['name']     = $data->Name;
                $rdata['role']     = $data->Role;
                $rdata['rolename'] = getrolename($data->Role);
                $rdata['token']    = self::getjwtstr($sb['msg']);
                return myok(['login'=>'ok','data'=>$rdata]);
            default:
                return myok();
                break;
        }
    }

    /**
     * 网络代理接口
     * @return [type] [description]
     */
    public function qiunile()
    {
        self::islog();
        self::reSession();

        $url    = Request::url(true);
        $urlstr = substr($url, strpos($url, 'qiunile') + 12);
        $uurl   = 'https://apis.map.qq.com/ws/geocoder/v1/' . $urlstr;
        return self::https_request($uurl);
    }
    protected function https_request($url, $data = null)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        if (!empty($data)) {
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        //下面这行是修改后增加的代码，就是配置设置host访问，发送的数据类型为application/json
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/json; charset=utf-8',
            'Content-Length: ' . strlen($data),
        ));
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }
}
